<?php

namespace CHOMP\SGIBundle\Entity;	
	
use	 Doctrine\ORM\Mapping as ORM;
use	 Symfony\Component\Validator\Constraints as Assert;
use	 Doctrine\Common\Collections\ArrayCollection;
use	 Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use	 Symfony\Component\HttpFoundation\File\UploadedFile;														


/**
 * @ORM\Entity (repositoryClass="CHOMP\SGIBundle\Entity\IncidenteRepository")
 * @ORM\Table(name="incidente")
 * @ORM\HasLifecycleCallbacks()
 */
class Incidente
{
    /**
	 * @ORM\PrePersist
	 * @ORM\PreUpdate
	 */
    public function updatedTimestamps()
    {
    	$date = new \DateTime('NOW'); 
        $this->setFechaModificacion(new \DateTime(date('Y-m-d H:i:s')));
        if($this->getFechaCreacion() == null)
        {
            $this->setFechaCreacion($date);
        }
    }

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=40, nullable=false)
	 * @Assert\NotBlank(
	 *       message = "El título no puede estar vacío."
	 *		)
	 * @Assert\Length(
     *      min = "4",
     *      max = "40",
	 *      minMessage = "El nombre debe tener al menos {{ limit }} caracteres.",
     *      maxMessage = "El nombre debe tener {{ limit }} caracteres como máximo."
	 *		)
     */
    protected $titulo;
	
    /**
     * @ORM\Column(type="string", length=400, nullable=false)
	 * @Assert\NotBlank(
	 *       message = "La descripcion no puede estar vacío."
	 *		)
     */
    protected $descripcion;
    /**
     * @ORM\Column(type="datetime", nullable=false)
	 * @Assert\NotNull(message = "El campo titulo no puede estar en blanco.")
     */
	protected $fechaCreacion;

    /**
     * @ORM\Column(type="datetime", nullable=true)
	 * @Assert\NotNull(message = "El campo fecha modificacion no puede estar en blanco.")
     */
	protected $fechaModificacion;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
	protected $fechaLimiteSLA;
	
    /**
     * @ORM\Column(type="datetime", nullable=true)
     */	
	protected $fechaCierreAutomatico;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */	
	protected $fechaCierre;
	
	 /**
     * @ORM\ManyToOne(targetEntity="Estado")
	 * @ORM\JoinColumn(name="estado_id", referencedColumnName="id", nullable=false)
	 * @Assert\NotNull(message = "El campo Estado no puede estar en blanco.")
     */
	protected $estado;
  
  	 /**
     * @ORM\ManyToOne(targetEntity="Prioridad")
	 * @ORM\JoinColumn(name="prioridad_id", referencedColumnName="id", nullable=false)
	 * @Assert\NotNull(message = "El campo Prioridad no puede estar en blanco.")
     */
	protected $prioridad;

	 /**
     * @ORM\ManyToOne(targetEntity="Empresa")
	 * @ORM\JoinColumn(name="empresa_id", referencedColumnName="id", nullable=false)
	 * @Assert\NotNull(message = "El campo Empresa no puede estar en blanco.")
     */
	protected $empresa;
	
	 /**
     * @ORM\ManyToOne(targetEntity="CuentaAnalitica")
	 * @ORM\JoinColumn(name="cuentaAnalitica_id", referencedColumnName="id", nullable=true)
     */
	protected $cuentaAnalitica;
	
	/**
     * @ORM\ManyToOne(targetEntity="Usuario")
	 * @ORM\JoinColumn(name="creador_id", referencedColumnName="id", nullable=false)
	 * @Assert\NotNull(message = "El campo creador no puede estar en blanco.")
     */
	protected $creador;
	
	/**
     * @ORM\ManyToOne(targetEntity="Usuario")
	 * @ORM\JoinColumn(name="responsableSoporte_id", referencedColumnName="id", nullable=true)
     */
	protected $responsableSoporte;
	
	/**
     * @ORM\ManyToOne(targetEntity="Usuario")
	 * @ORM\JoinColumn(name="responsableCliente_id", referencedColumnName="id", nullable=true)
     */
	protected $responsableCliente;
  
	 /**
     * @ORM\ManyToOne(targetEntity="GrupoSoporte")
	 * @ORM\JoinColumn(name="grupoSoporte_id", referencedColumnName="id", nullable=true)
     */
	protected $grupoSoporte;
	
	/**
     * @ORM\OneToMany(targetEntity="Comentario", mappedBy="incidente", cascade="persist")
	 * @ORM\OrderBy({"id" = "DESC"})
     */
	protected $comentarios;

	/**
     * @ORM\OneToMany(targetEntity="Timesheet", mappedBy="incidente")
     * 
	 */
    private $timesheets;

    /**
     * @ORM\OneToMany(targetEntity="Auditoria", mappedBy="incidente")
     * 
     */
    private $auditorias;
	
	/**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    public $path;

	/**
     * @Assert\File(maxSize="6000000")
     */
    private $file;
		
	/**********************************
     * __construct
     *
     * 
     **********************************/		
	function __construct()
	{ 
		 $this->comentarios = new ArrayCollection();	
		 $this->timesheets = new ArrayCollection();
		 //Poner la fecha de creación
		 $date = new \DateTime('NOW'); 
		 $this->setFechaCreacion($date);
		 $this->setFechaModificacion($date);
		 $this->comentarios = new ArrayCollection();
         $this->auditoria = new ArrayCollection();
   	} 
	
    /**********************************
     * __toString()
     *
     * Este método sirve para poder popular los comboboxes en los forms.
     *********************************/ 
	 public function __toString()
	{
		return $this->getTitulo();
	}	
	
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set titulo
     *
     * @param string $titulo
     * @return Incidente
     */
    public function setTitulo($titulo)
    {
        $this->titulo = $titulo;
    
        return $this;
    }

    /**
     * Get titulo
     *
     * @return string 
     */
    public function getTitulo()
    {
        return $this->titulo;
    }
	
    /**
     * Set descripcion
     *
     * @param string $descripcion
     * @return Incidente
     */
    public function setDescripcion($descripcion)
    {
        $this->descripcion = $descripcion;
    
        return $this;
    }

    /**
     * Get descripcion
     *
     * @return string 
     */
    public function getDescripcion()
    {
        return $this->descripcion;
    }
	
    /**
     * Set fechaCreacion
     *
     * @param \DateTime $fechaCreacion
     * @return Incidente
     */
    public function setFechaCreacion($fechaCreacion)
    {
        $this->fechaCreacion = $fechaCreacion;
    
        return $this;
    }

    /**
     * Get fechaCreacion
     *
     * @return \DateTime 
     */
    public function getFechaCreacion()
    {
        return $this->fechaCreacion;
    }

    /**
     * Set fechaModificacion
     *
     * @param \DateTime $fechaModificacion
     * @return Incidente
     */
    public function setFechaModificacion($fechaModificacion)
    {
        $this->fechaModificacion = $fechaModificacion;
    
        return $this;
    }

    /**
     * Get fechaModificacion
     *
     * @return \DateTime 
     */
    public function getFechaModificacion()
    {
        return $this->fechaModificacion;
    }

    /**
     * Set fechaLimiteSLA
     *
     * @param \DateTime $fechaLimiteSLA
     * @return Incidente
     */
    public function setFechaLimiteSLA($fechaLimiteSLA)
    {
        $this->fechaLimiteSLA = $fechaLimiteSLA;
    
        return $this;
    }

    /**
     * Get fechaLimiteSLA
     *
     * @return String
     */
    public function getFechaLimiteSLA()
    {	
		$fechaLimite =  $this->fechaLimiteSLA;

		if($this->fechaLimiteSLA == NULL){
	        $this->fechaLimiteSLA;
		}else{
	        return $fechaLimite->format('Y-m-d H:i:s');
		}
    }

    /**
     * Set fechaCierreAutomatico
     *
     * @param \DateTime $fechaCierreAutomatico
     * @return Incidente
     */
    public function setFechaCierreAutomatico($fechaCierreAutomatico)
    {
        $this->fechaCierreAutomatico = $fechaCierreAutomatico;
    
        return $this;
    }

    /**
     * Get fechaCierreAutomatico
     *
     * @return String 
     */
    public function getFechaCierreAutomatico()
    {
		$fechaCierreAuto = $this->fechaCierreAutomatico;
		if($this->fechaCierreAutomatico == NULL){
	        return $this->fechaCierreAutomatico;
		}else{
	        return $fechaCierreAuto->format('Y-m-d H:i:s');
		}
    }

    /**
     * Set fechaCierre
     *
     * @param \DateTime $fechaCierre
     * @return Incidente
     */
    public function setFechaCierre($fechaCierre)
    {
        $this->fechaCierre = $fechaCierre;
    
        return $this;
    }

    /**
     * Get fechaCierre
     *
     * @return \DateTime
     */
    public function getFechaCierre()
    {
        return $fechaCierre;
    }

    /**
     * Set estado
     *
     * @param \CHOMP\SGIBundle\Entity\Estado $estado
     * @return Incidente
     */
    public function setEstado(\CHOMP\SGIBundle\Entity\Estado $estado)
    {
        $this->estado = $estado;
    
        return $this;
    }

    /**
     * Get estado
     *
     * @return \CHOMP\SGIBundle\Entity\Estado 
     */
    public function getEstado()
    {
        return $this->estado;
    }

    /**
     * Set prioridad
     *
     * @param \CHOMP\SGIBundle\Entity\Prioridad $prioridad
     * @return Incidente
     */
    public function setPrioridad(\CHOMP\SGIBundle\Entity\Prioridad $prioridad)
    {
        $this->prioridad = $prioridad;
		$fechainicial = clone $this->getFechaCreacion();
		$fechaLimite = $fechainicial->add(new \DateInterval('P'.$prioridad->getSLA().'D'));
		$this->setFechaLimiteSLA($fechaLimite);
		$this->setFechaCierreAutomatico($fechaLimite);
    
        return $this;
    }

    /**
     * Get prioridad
     *
     * @return \CHOMP\SGIBundle\Entity\Prioridad 
     */
    public function getPrioridad()
    {
        return $this->prioridad;
    }

    /**
     * Set empresa
     *
     * @param \CHOMP\SGIBundle\Entity\Empresa $empresa
     * @return Incidente
     */
    public function setEmpresa(\CHOMP\SGIBundle\Entity\Empresa $empresa)
    {
        $this->empresa = $empresa;
    
        return $this;
    }

    /**
     * Get empresa
     *
     * @return \CHOMP\SGIBundle\Entity\Empresa 
     */
    public function getEmpresa()
    {
        return $this->empresa;
    }

    /**
     * Set cuentaAnalitica
     *
     * @param \CHOMP\SGIBundle\Entity\CuentaAnalitica $cuentaAnalitica
     * @return Incidente
     */
    public function setCuentaAnalitica(\CHOMP\SGIBundle\Entity\CuentaAnalitica $cuentaAnalitica)
    {
        $this->cuentaAnalitica = $cuentaAnalitica;
    
        return $this;
    }

    /**
     * Get cuentaAnalitica
     *
     * @return \CHOMP\SGIBundle\Entity\CuentaAnalitica 
     */
    public function getCuentaAnalitica()
    {
        return $this->cuentaAnalitica;
    }

    /**
     * Set creador
     *
     * @param \CHOMP\SGIBundle\Entity\Usuario $creador
     * @return Incidente
     */
    public function setCreador(\CHOMP\SGIBundle\Entity\Usuario $creador)
    {
        $this->creador = $creador;
    
        return $this;
    }

    /**
     * Get creador
     *
     * @return \CHOMP\SGIBundle\Entity\Usuario 
     */
    public function getCreador()
    {
        return $this->creador;
    }

    /**
     * Set responsableSoporte
     *
     * @param \CHOMP\SGIBundle\Entity\Usuario $responsableSoporte
     * @return Incidente
     */
    public function setResponsableSoporte(\CHOMP\SGIBundle\Entity\Usuario $responsableSoporte)
    {
        $this->responsableSoporte = $responsableSoporte;
    
        return $this;
    }

    /**
     * Get responsableSoporte
     *
     * @return \CHOMP\SGIBundle\Entity\Usuario 
     */
    public function getResponsableSoporte()
    {
        return $this->responsableSoporte;
    }

    /**
     * Set responsableCliente
     *
     * @param \CHOMP\SGIBundle\Entity\Usuario $responsableCliente
     * @return Incidente
     */
    public function setResponsableCliente(\CHOMP\SGIBundle\Entity\Usuario $responsableCliente)
    {
        $this->responsableCliente = $responsableCliente;
    
        return $this;
    }

    /**
     * Get responsableCliente
     *
     * @return \CHOMP\SGIBundle\Entity\Usuario 
     */
    public function getResponsableCliente()
    {
        return $this->responsableCliente;
    }

    /**
     * Set grupoSoporte
     *
     * @param \CHOMP\SGIBundle\Entity\GrupoSoporte $grupoSoporte
     * @return Incidente
     */
    public function setGrupoSoporte(\CHOMP\SGIBundle\Entity\GrupoSoporte $grupoSoporte)
    {
        $this->grupoSoporte = $grupoSoporte;
    
        return $this;
    }

    /**
     * Get grupoSoporte
     *
     * @return \CHOMP\SGIBundle\Entity\GrupoSoporte 
     */
    public function getGrupoSoporte()
    {
        return $this->grupoSoporte;
    }

    /**
     * Add comentarios
     *
     * @param \CHOMP\SGIBundle\Entity\Comentario $comentarios
     * @return Incidente
     */
    public function addComentario(\CHOMP\SGIBundle\Entity\Comentario $comentarios)
    {
		 $comentarios->setIncidente($this);
		 $this->comentarios->add($comentarios);
		 
		 return $this;
    }

    /**
     * Remove comentarios
     *
     * @param \CHOMP\SGIBundle\Entity\Comentario $comentarios
     */
    public function removeComentario(\CHOMP\SGIBundle\Entity\Comentario $comentarios)
    {
        $this->comentarios->removeElement($comentarios);
    }

    /**
     * Get comentarios
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getComentarios()
    {
        return $this->comentarios;
    }

    /**
     * Set timesheet
     *
     * @param \CHOMP\SGIBundle\Entity\Timesheet $timesheet
     * @return Incidente
     */
    public function setTimesheet(\CHOMP\SGIBundle\Entity\Timesheet $timesheet = null)
    {
        $this->timesheet = $timesheet;
    
        return $this;
    }

    /**
     * Get timesheet
     *
     * @return \CHOMP\SGIBundle\Entity\Timesheet 
     */
    public function getTimesheet()
    {
        return $this->timesheet;
    }

    /**
     * Add timesheets
     *
     * @param \CHOMP\SGIBundle\Entity\Timesheet $timesheets
     * @return Incidente
     */
    public function addTimesheet(\CHOMP\SGIBundle\Entity\Timesheet $timesheets)
    {
        $this->timesheets[] = $timesheets;
    
        return $this;
    }

    /**
     * Remove timesheets
     *
     * @param \CHOMP\SGIBundle\Entity\Timesheet $timesheets
     */
    public function removeTimesheet(\CHOMP\SGIBundle\Entity\Timesheet $timesheets)
    {
        $this->timesheets->removeElement($timesheets);
    }

    /**
     * Get timesheets
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getTimesheets()
    {
        return $this->timesheets;
    }

    /**
     * Add auditorias
     *
     * @param \CHOMP\SGIBundle\Entity\Auditoria $auditorias
     * @return Incidente
     */
    public function addAuditoria(\CHOMP\SGIBundle\Entity\Auditoria $auditorias)
    {
        $this->auditorias[] = $auditorias;
    
        return $this;
    }

    /**
     * Remove auditorias
     *
     * @param \CHOMP\SGIBundle\Entity\Auditoria $auditorias
     */
    public function removeAuditoria(\CHOMP\SGIBundle\Entity\Auditoria $auditorias)
    {
        $this->auditorias->removeElement($auditorias);
    }

    /**
     * Get auditorias
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getAuditorias()
    {
        return $this->auditorias;
    }
	
	public function getAbsolutePath()
    {
        return null === $this->path
            ? null
            : $this->getUploadRootDir().'/'.$this->path;
    }

    public function getWebPath()
    {
        return null === $this->path
            ? null
            : $this->getUploadDir().'/'.$this->path;
    }

    protected function getUploadRootDir()
    {
        // the absolute directory path where uploaded
        // documents should be saved
        return __DIR__.'/../../../../web/'.$this->getUploadDir();
//      return __DIR__.'/'.$this->getUploadDir();
    }

    protected function getUploadDir()
    {
        // get rid of the __DIR__ so it doesn't screw up
        // when displaying uploaded doc/image in the view.
        return 'uploads/documents';
    }
	
	/**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file = null)
    {
        $this->file = $file;
    }

    /**
     * Get file.
     *
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    }

	public function upload()
	{
		// the file property can be empty if the field is not required
		if (null === $this->getFile()) {
			return;
		}
		
		// move takes the target directory and then the
		// target filename to move to
		$this->getFile()->move(
			$this->getUploadRootDir(),
			$this->id.'-'.$this->titulo.'-'.$this->getFile()->getClientOriginalName()
		);
	
		// set the path property to the filename where you've saved the file
		$this->path = $this->id.'-'.$this->titulo.'-'.$this->getFile()->getClientOriginalName();
		
		// clean up the file property as you won't need it anymore
		$this->file = null;
	}
	
	 /**
     * Get fechaSLA
     *
     * @return String
     */
    public function getFechaSLA()
    {	
		$fechaLimite =  $this->fechaLimiteSLA;
        return $fechaLimite;
    }

    /**
     * Get fechaCA
     *
     * @return String 
     */
    public function getFechaCA()
    {
		$fechaCierreAuto = $this->fechaCierreAutomatico;
        return $fechaCierreAuto;
    }

    /**
     * Get fechaC
     *
     * @return String 
     */
    public function getFechaC()
    {
		$fechaCierre = $this->fechaCierre;
        return $fechaCierre;
    }



}